home *** CD-ROM | disk | FTP | other *** search
- /*
- * An output filter to produce LaTeX using Paul DuBois' RTF reader
- * WECHTL Erwin
- * Woerthg. 2/18
- * A-2500 Baden
- * AUSTRIA
- *
- * a student of the University in vienna
- * Technische Universitaet Wien
- * Institut fuer Technische Informatik
- * Treitlstr. 3
- * A-1040 WIEN
- * AUSTRIA
- *
- * Changed code from:
- *
- * Written and copyright (c) 1991 by Robert Lupton (rhl@astro.princeton.edu)
- * Permission is granted to freely distribute and modify this code, providing:
- * 1/ This copyright notice is preserved
- * 2/ You send me a copy of any changes for inclusion in a future release
- */
- #ifdef __STDC__ /* Convert to a string */
- # define STR(S) #S /* ANSI */
- # define A(x) x /* for prototypes */
- #else
- # define STR(S) "S" /* often works... */
- # define A(x) /* no prototypes */
- #endif
- #define TW_TO_CA(I) ((I)/(4,5*20.0)) /* convert twips to number of characters */
- #define CA_TO_TW(I) ((I)*(4,5*20.0)) /* convert twips to number of characters */
- #define TW_TO_PT(I) ((I)/20.0) /* convert twips to points */
- #define TW_TO_IN(I) ((I)/(72*20.0)) /* convert twips to inches. Note that*/
- #define IN_TO_TW(I) ((float)(I*72*20)) /* RTF assumes 1" = 72pt, not 72.27 */
-
-
- /*****************************************************************************/
- /*
- * Tab things
- */
- #define defaultTabWidth 8
- #define TabLeft 0 /* values for type */
- #define TabCentre 1
- #define TabRight 2
- #define TabDecimal 3
-
- typedef struct {
- int pos; /* positions of tabstops in twips */
- int type; /* type of centering */
- }TABSTOPS;
- #define NTABS 12 /* maximum number of tabs */
- static void tabstopsInit A((void));
- static void start_tabstops A((void));
- static int tab=0;
- static TABSTOPS tabstops[NTABS], /* the current values */
- old_tabstops[NTABS]; /* and the old ones */
- static int ignore_tabwidths = 0; /* ignore the positions of tabs */
- static int ntabs = 0; /* number of tabstops set */
- static int old_ntabs = 0; /* number of tabstops in old_tapstops*/
- static tab_num = 0; /* the number of the next tab */
-
- static void end_table A((void));
- static char tabinitold[80]; /* parameters of the last table */
- static char tabinitnew[80]; /* parameters of the current table */
- static float smaller_cell_factor = 0.7; /* to de/encrease the width of the cells */
- float f;
- static int max_cellnr = 0; /* maximum number of cells of the current table */
- static int cellnr = 0; /* current number of the cell of the current table */
- static int endOfLastCell;
- static int table_mode = 0; /* Are we in a table */
-
- static void output_8bit A((int)); /* output a char with 8th bit set */
- static void output_str A((char *, int));/* output commands, comments... */
- static void output A((int, int)); /* output a character and looking for
- special ones */
- static void p6 A((char *));
-
-
- #define TRUE 1;
- #define FALSE 0;
-
- static void UnknownClass A((void));
- static void GroupClass A((void));
- static void TblAttr A((void));
- static void TextClass A((void));
- static void CharSet A((void));
- static void ControlClass A((void));
- static void Destination A((void));
- static void SpecialChar A((void));
- static void DocAttr A((void));
- static void SectAttr A((void));
- static void ParAttr A((void));
- static void CharAttr A((void));
- static void PictAttr A((void));
- static void FieldAttr A((void));
- static void TOCAttr A((void));
- static void PosAttr A((void));
- /*****************************************************************************/
- /*
- * The flag values for the RTF and LaTeX group stacks
- */
- #define Undefined 0 /* LaTeX type */
- #define Math 1
- #define Font 2
- #define Font_Num 3
- #define Font_Size 4
- #define Style 5
- #define Par_Attr 6
- #define Footnote 7
- #define Start_Para 8
- #define Sub_Super 9
- #define TabularInit 11
- #define Tabular 12
- #define Desti 13
- #define Underline 14
- #define Paragraph 15
- #define NormalWORDstyle 16
- #define SpecialWORDstyle 10
- #define Header 17
- #define LRskip 18
- #define Tabstops 19
-
-
- #define Plain 1 /* RTF and LaTeX flags if(Font) */
- #define Bold 2
- #define Italic 3
- #define Outlined 4
- #define Shadow 5
- #define SmallCaps 6
- #define AllCaps 7
- #define StrikeThru 8
- #define Invisible 9
-
- #define LeftAlign 01 /* RTF and LaTeX flags if(Par_Attr) */
- #define RightAlign 02
- #define Centred 04
-
- #define Pageno_Decimal 1 /* pagenumber styles */
- #define Pageno_LRoman 2
- #define Pageno_URoman 3
- /*
- * First the LaTeX stack, used to remember what needs to be written as
- * we close groups (including math groups)
- */
- typedef struct latex_group {
- char *str; /* what needs inserting */
- long type; /* what type it is */
- long flags; /* details of the type */
- long saved; /* save the old value of something */
- struct latex_group *prev;
- } LATEX_STACK;
-
-
- /*****************************************************************************/
- /*
- * And then RTF grouping stuff
- */
- typedef struct {
- long font; /* which font */
- int FontNum;
- int FontType;
- int FontSize;
- int sub_super_height; /* vertical offset of text */
- int smallcaps;
- } CHAR_ATTR;
-
- typedef struct {
- long flags; /* centering, justification, etc. */
- int parindent; /* \fi to RTF */
- int leftskip,rightskip; /* \li/\ri to RTF */
- int parskip; /* the usual LaTeX parskip */
- int skip_before,skip_after; /* \sb/\sa to RTF */
- } PAR_ATTR;
-
- typedef struct status {
- LATEX_STACK *LaTeX_stack; /* stack of LaTeX stuff to output */
- CHAR_ATTR char_attr; /* Character attributes */
- PAR_ATTR par_attr; /* Paragraph attributes */
- int style; /* current style (if relevant) */
- struct status *prev;
- } RTF_STACK;
-
- static CHAR_ATTR char_attr = {
- Plain, /* font */
- -1, /* FontNum */
- 0, /* FontType */
- 10, /* FontSize */
- 0, /* sub super heigh */
- 0, /* smallcaps */
- };
- #define LaTeXdefault -99
- static PAR_ATTR par_attr = {
- 0,
- LaTeXdefault, /* parindent */
- 0, 0, /* left/rightskip */
- 0, 0, /* skip_before/after */
- };
- typedef struct LATEXStyle LATEXStyle;
-
- struct LATEXStyle
- {
- char *rtfSName; /* style name */
- int rtfSNum; /* style number */
- LATEXStyle *LaTeXNextStyle; /* next style in style list */
- char BeginCommand[80]; /* begin and */
- char EndCommand[80]; /* end of LaTeX-command*/
- int special_WinwordStyle;
- int stacktype;
- CHAR_ATTR char_attr; /* Character attributes */
- PAR_ATTR par_attr; /* Paragraph attributes */
- };
-
-
-
- static void pop_rtf_group A((void)); /* pop the status group */
- static void push_rtf_group A((void)); /* push the status group */
- static int pop_LaTeX_stack A((void)); /* pop the LaTeX stack */
- static void push_LaTeX_stack A((char *, int, long));
- static int top_LaTeX_flags A((int)); /* return the flags of the stack top */
- static RTF_STACK *rtf_ptr;
- static RTF_STACK rtf_current; /* current values of things that
- get pushed on rtf stack */
- static RTF_STACK rtf_default; /* default values of things that
- live on the rtf stack */
-
-
- /*****************************************************************************/
- /*
- * Document attributes, not subject to grouping
- */
- static int pageno = 1;
- static int pageno_style = Pageno_Decimal;
- static int pageno_x = 720; /* 0.5" */
- static int pageno_y = 720; /* 0.5" */
- static int lineno = 1;
- static int paper_width = 12240; /* 8.5" */
- static int paper_height = 15840; /* 11" */
- static int left_margin = 1800; /* 1.25" */
- static int right_margin = 1800; /* 1.25" */
- static int top_margin = 1440; /* 1.5" */
- static int bottom_margin = 1440; /* 1.5" */
-
-
- /*****************************************************************************/
-
- static void end_para A((void)); /* print the end-of-para string */
- static void msg_map_to A((char *, char *));/* treat one keyword as another */
- static void msg_not_needed A((char *)); /* LaTeX doesn't need this keyword */
- static void msg_not_supported A((char *));/* LaTeX can't use this keyword */
- static void msg_not_yet A((char *)); /* Not yet supported */
- static void in_math A((char *)); /* output must be in math mode */
- static void initialise A((void)); /* initialise the document */
- static char *page_num A((void)); /* a string giving the current pageno*/
- static void print_text A((char **, FILE *));/* print some text (char *text[]) */
- static void read_pict A((void)); /* read an rtfPict destination */
- static void set_font A((int, int, char *, char *));/* switch to a new font */
- static void set_headfoot_lines A((void));/* set \head/footline */
- static void start_para A((void)); /* Called at the start of each para */
- static char *LaTeX_name A((char *)); /* remove spaces from a word */
- static void update_current A((void)); /* update the current state */
- static void set_subsuper A((int));
- static void set_smallcaps A((void));
- static void usage A((void)); /* print a helpful message */
- static char *StrSave A((char *));
- static void DefineStyles A((void));
- static void setstylecommand A((int));
- static void set_fontsize A((int));
-
- static char buff[100]; /* temporary scratch space */
-
- static int change_headfoot = 1; /* change the \head/footline? */
- static int default_font = -1; /* The default font */
- static int end_of_par = 0; /* we just saw rtfPar */
- static int footnote_num0 = 1; /* the starting footnote number */
- static int footnotes_restart_each_page = 1; /* as it says */
- static int in_table = 0; /* are we in a table? */
- static int inDefineStyle; /* In this procedure */
- static int initialised = 0; /* have we called initialise() yet? */
- static int verbose = 0; /* shall we output some information on stderr */
- static noUnderline = 0; /* change underline to italic */
- static int header_on = 1; /* use RTR_header (if 0 use LaTeX default header */
- static int rl_skip_on = 1; /* translate left and right skip of paragraphs
- may cause some trouble */
- static int other_linebreak = 0; /* use \hfil\break instead of \\
- for making a new line */
- static int tabstops_on = 1;
- static int formatting_para = 1; /* translate paragraph formating stuff */
- static int formatting_char = 1; /* translate character formating stuff */
- static int formatting_table = 1; /* formating in tables? default: on */
- static int formatting_sWORD = 0; /* use WORD-style for heading, footer
- (if 0 use LaTeX default formatting */
- static int Cformatting_para; /* current formating on? */
- static int Cformatting_char;
- static int no_grouping = 0; /* don't allow any LaTeX font grouping */
- static int rtf_group = 0; /* level of RTF grouping */
- static int text_out = 0; /* we are actually writing text */
- static int LaTeX_group = 0; /* level of RTF grouping */
- static int writing_defs = 0; /* are we writing macro definitions? */
- static int german_squotes =0; /* German single quotes on output ? */
- static int german_dquotes =0; /* German double quotes on output ? */
- static int quotecount =0; /* Count doublequotes if next true */
- static int translate_quotes =0; /* Translate doublequotes to
- * alternating begin and end quotes
- */
-
- #define line_length 255 /* the parameter for fgets */
- static void read_code_file A((char *)); /* file with the characters above 128 */
- static void open_code_file A((char *)); /* file with the characters above 128 */
- static void open_land_file A((char *)); /* file with the special WORD styles */
- static FILE *fpcode, *fpland;
-
-